package de.dpunkt.myaktion.service;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;

import javax.ejb.ObjectNotFoundException;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;

import de.dpunkt.myaktion.model.Aktion;
import de.dpunkt.myaktion.model.FormConfig;
import de.dpunkt.myaktion.model.Konto;
import de.dpunkt.myaktion.model.Spende;
import de.dpunkt.myaktion.model.Spende.Status;

@SessionScoped
public class AktionServiceBean implements AktionService, Serializable {

	private static final long serialVersionUID = 2903556448967273173L;

	@Inject
	private IdService idService;
	
	@Override
	public List<Aktion> getAllAktionen() {
		final List<Aktion> aktionen = getAllAktionenInternal();
		for (final Aktion aktion : aktionen) aktion.setBisherGespendet(getBisherGespendet(aktion));
		return aktionen;
	}
	
	@Override
	public Aktion getAktion(final String name) throws ObjectNotFoundException {
		Aktion managedAktion = null;
		for (final Aktion aktion : getAllAktionenInternal()) {
			if (name.equalsIgnoreCase(aktion.getName()))  {
				managedAktion = aktion;
				break;
			}
		}
		if (managedAktion == null) throw new ObjectNotFoundException();
		return managedAktion;
	}

	@Override
	public Aktion getAktion(final Long aktionId) throws ObjectNotFoundException {
		Aktion managedAktion = null;
		for (final Aktion aktion : getAllAktionenInternal()) {
			if (aktionId.equals(aktion.getId()))  {
				managedAktion = aktion;
				break;
			}
		}
		if (managedAktion == null) throw new ObjectNotFoundException();
		return managedAktion;
	}

	@Override
	public FormConfig getFormConfig(final Long aktionId) throws ObjectNotFoundException {
		return getAktion(aktionId).getFormConfig();
	}
	
	@Override
	public Aktion addAktion(final Aktion aktion) {
		aktion.setId(idService.nextId());
		getAllAktionenInternal().add(aktion);
		return aktion;
	}
	
	@Override
	public void deleteAktion(final Long aktionId) throws ObjectNotFoundException {
		deleteAktion(getAktion(aktionId));
	}
	
	@Override
	public void deleteAktion(final Aktion aktion) throws ObjectNotFoundException {
		getAllAktionenInternal().remove(aktion);
	}
	
	@Override
	public Aktion updateAktion(final Aktion aktion)  throws ObjectNotFoundException{
		final Aktion managedAktion = getAktion(aktion.getId());
		managedAktion.setKonto(aktion.getKonto());
		managedAktion.setName(aktion.getName());
		managedAktion.setSpendenBetrag(aktion.getSpendenBetrag());
		managedAktion.setSpendenZiel(aktion.getSpendenZiel());
		return managedAktion;
	}
	
	@Override
	public Double getBisherGespendet(final Aktion aktion) {
		return 0d;
	}
	
	private List<Aktion> aktionen = null;
	
	private List<Aktion> getAllAktionenInternal() {
		if (aktionen == null) {
			aktionen = createMockAktionen();
		}
		return aktionen;
	}

	private List<Aktion> createMockAktionen() {
		final Spende spende1 = new Spende();
		spende1.setId(idService.nextId());
		spende1.setSpenderName("Heinz Schmidt");
		spende1.setBetrag(20d);
		spende1.setQuittung(true);
		spende1.setStatus(Status.UEBERWIESEN);
		spende1.setKonto(new Konto(spende1.getSpenderName(), "XXX Bank", "123456", "87654321"));
		
		final Spende spende2 = new Spende();
		spende2.setId(idService.nextId());
		spende2.setSpenderName("Karl Meier");
		spende2.setBetrag(30d);
		spende2.setQuittung(true);
		spende2.setStatus(Status.IN_BEARBEITUNG);
		spende2.setKonto(new Konto(spende2.getSpenderName(), "YYY Bank", "123456", "87654321"));
		
		final Aktion aktion1 = new Aktion();
		aktion1.setName("Trikots für A-Jugend");
		aktion1.setSpendenZiel(1000d);
		aktion1.setBisherGespendet(258d);
		aktion1.setSpendenBetrag(20d);
		aktion1.setId(idService.nextId());
		aktion1.setKonto(new Konto("Max Mustermann", "ABC Bank", "100200300", "12345678"));
		aktion1.addSpende(spende1);
		
		final Aktion aktion2 = new Aktion();
		aktion2.setName("Rollstuhl für Maria");
		aktion2.setSpendenZiel(2500d);
		aktion2.setBisherGespendet(742d);
		aktion2.setSpendenBetrag(25d);
		aktion2.setId(idService.nextId());
		aktion2.setKonto(aktion1.getKonto());
		aktion2.addSpende(spende2);
		
		final List<Aktion> ret = new LinkedList<>();
		ret.add(aktion1);
		ret.add(aktion2);
		
		return ret;
	}	
}
